#include "OSAL_MSG.h"
#include "OSAL.h"
#include "stdlib.h"
#include "sys.h"
#include "misc.h"


static struct osal_msg_t  * Head; /*消息头*/


/**
 * @fn osal_msg_init
 * @brief 初始化消息队列
 * @param none
 * @return none 
 * 
 */
void osal_msg_init(void)
{
    Head = osal_msg_allocate();
    Head->next = NULL;
}


/**
 * @fn osal_msg_allocate
 * @brief 申请一片消息空间
 * @param none
 * @return 返回指向osal_msg_t的指针
 */
struct osal_msg_t * osal_msg_allocate(void)
{
    return (struct osal_msg_t *)OSAL_Mem_Malloc(sizeof(struct osal_msg_t));
}


/**
 * @fn osal_msg_delete
 * @brief 删除掉消息和对应的消息缓冲区
 * @param destTaskID-要删除消息的任务
 * 
 */
void osal_msg_delete(uint16_t destTaskID)
{
  struct osal_msg_t * msg;
  struct osal_msg_t * prevMsg;
    if(Head == NULL)
        return;
    msg = Head->next;
    prevMsg = Head->next;

    while(msg)
    {
        if(msg->destTaskID == destTaskID)
        {   
            prevMsg->next = msg->next;
            OSAL_Mem_Free(msg->msgPtr);
            OSAL_Mem_Free(msg);
        }
        prevMsg = msg;
        msg = msg->next;
    }
}

/**
 * @fn osal_msg_send
 * @brief 向消息队列发送一条消息 
 * @param destTaskID-向哪个任务发送消息， struct osal_msg_t * msg-发送的消息
 * @return none
 */
void osal_msg_send(uint16_t destTaskID, struct osal_msg_t * msg)
{
    if(Head == NULL)
        return;
    msg->destTaskID = destTaskID;
    msg->next = Head->next;
    Head->next = msg;
    OSAL_SetEvent(destTaskID, OSAL_MSG_EVENT);

        
    
}

/**
 * @fn osal_msg_recevie
 * @brief 遍历消息队列， 找到属于自己的消息 
 * @param none
 * @return 指向获取到的消息的指令
 */
struct osal_msg_t * osal_msg_recevie(void)
{


    struct osal_msg_t * prevMsg;
    if(Head == NULL)
        return NULL;
    prevMsg = Head->next;


    while(prevMsg)
    {
        if(prevMsg->destTaskID == activeTask)//现在活跃的任务
        {   
            return prevMsg;
        }
        prevMsg = prevMsg->next;
    }
    return NULL;

}

/**
 * @fn osal_msg_clear
 * @brief 清空消息队列
 * @param none
 * @return none
 */
void osal_msg_clear(void)
{

}